function Foo() {
    console.log(this)
    this.getName = function () {
        console.log('1')
    }
    return this
}
Foo.getName = function () {
    console.log(2)
}
Foo.prototype.getName = function () {
    console.log('3')
}
var getName = function () {
    console.log('4')
}
function getName() {
    console.log('5')
};
Foo.getName(); //? Foo原型上的方法 打印2
getName(); //? 打印4 函数提升优于变量提升 所以打印4
Foo().getName(); //? 先执行Foo()函数 打印window肯定是没有问题的。因为执行Foo()，this.getName被改为window.getName,也就是现在window.getName=1 所以输出1
getName();   //? 顺理成章输出1
new Foo.getName(); //? Foo上的getName new的时候也是要执行这个构造函数的 所以输出2
new Foo().getName(); //? 这个是(new Foo()).getName() new Foo()导致内部的this指向Foo()的原型 也就是Foo。new Foo()创建出来的新对象调用getName方法。这个对象上有了getName方法 打印1
